﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProcelNasEscolas.Model.Fichas;
using ProcelNasEscolas.Model.Interfaces;
using ProcelNasEscolas.Model.Respostas;
using ProcelNasEscolas.Model;

namespace ProcelNasEscolas.Data
{
    public class AlunoDao : AbstractCrudDao<AlunoData>, IAlunoDao
    {
        public Aluno ToModelObject(AlunoData alunoData)
        {
            Aluno alunoModel = new Aluno();
            alunoModel.Id = alunoData.Id;
            alunoModel.DataDeCadastro = alunoData.DataDeCadastro;
            alunoModel.Endereco = alunoData.Endereco;
            alunoModel.Idade = alunoData.Idade;
            alunoModel.Nome = alunoData.Nome;
            alunoModel.Telefone = alunoData.Telefone;
            TurmaDao turma = new TurmaDao();
            alunoModel.Turma = turma.ToModelObject(alunoData.TurmaData);

            return alunoModel;
        }

        public AlunoData CreateOrUpdate(Aluno alunoModel)
        {
            try
            {
                AlunoData alunoData = new AlunoData();

                IList<AlunoData> alunos = this.GetObjectContext().IEntidadeDataSet.OfType<AlunoData>().Include("TurmaData").Include("TurmaData.EscolaData")
                .Where(aluno => aluno.Id == alunoModel.Id).ToList();

                if (alunos.Count == 0)
                {
                    this.Add("IEntidadeDataSet", alunoData);
                }
                else 
                {
                    alunoData = alunos.First();
                }

                alunoData.DataDeCadastro = alunoModel.DataDeCadastro;
                alunoData.Endereco = alunoModel.Endereco;
                alunoData.Idade = alunoModel.Idade;
                alunoData.Nome = alunoModel.Nome;
                alunoData.Telefone = alunoModel.Telefone;
                TurmaData turmaTemp = new TurmaDao().CreateOrUpdate(alunoModel.Turma);
                alunoData.TurmaData = this.GetObjectContext().IEntidadeDataSet.OfType<TurmaData>().Include("EscolaData").Where(turma => turma.Id == turmaTemp.Id).First();
                this.SaveChanges();

                return alunoData;
            }
            catch (Exception e)
            {
                System.Console.Out.WriteLine("" + e);
                return null;
            }
        }

        public Aluno GetAluno(int Id)
        {
            try
            {
                IList<AlunoData> result = this.GetObjectContext().IEntidadeDataSet.OfType<AlunoData>().Include("TurmaData").Include("TurmaData.EscolaData")
                    .Where(c => c.Id == Id).ToList();

                return this.ToModelObject(result.First());
            }
            catch (Exception e)
            {
                System.Console.Out.WriteLine("" + e);
                return null;
            }
        }

        public AlunoData[] getAluno()
        {
             return (from c in this.GetObjectContext().IEntidadeDataSet.OfType<AlunoData>().Include("TurmaData") select c).ToArray();
        }

        public IList<Aluno> GetAll()
        {
            IList<AlunoData> result = this.GetObjectContext().IEntidadeDataSet.OfType<AlunoData>().Include("TurmaData").Include("TurmaData.EscolaData")
                 .ToList();
            IList<Aluno> alunos = new List<Aluno>();

            foreach (AlunoData aluno in result)
            {
                alunos.Add(this.ToModelObject(aluno));
            }

            return alunos;
        }
    }
}
